home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 March / Gamestar_71_2005-03_dvd.iso / Dema / willofsteel_demo.exe / {app} / Data / Shaders / MultiAnimation14.fx < prev    next >
Text File  |  2004-10-23  |  11KB  |  395 lines

  1. // Matrix Pallette
  2. static const int MAX_MATRICES = 23;
  3. float4x3    WorldMatrixArray[MAX_MATRICES] : WORLDMATRIXARRAY;
  4. float4x4    ViewProjection;// : VIEWPROJECTION;
  5. float4x4    WorldMatrix;
  6. float4x4    ShadowViewProjection;
  7. float4x4    TextureMatrix;
  8. float4x4    ViewIT;
  9.  
  10. texture DiffuseTexture;
  11. texture ShadowTexture;
  12. texture FogOfWar;
  13.  
  14. float3 LightDirection = {0.0f, 0.0f, -1.0f };    //light Direction 
  15. float3 SunColor       = { 1., 0.86, .70 };
  16. float3 Ambient        = { 0.24, 0.12, 0.04 };
  17. float4 ZBias          = { 0.0, 0.0, 0.0, -0.003 };
  18. float4 ShadowOffset;
  19. float4 BlinkFactor     = { 0.4, 0.4, 0.4, 0.4 };
  20.  
  21. ///////////////////////////////////////////////////////
  22. struct VS_INPUT
  23. {
  24.     float4  Pos             : POSITION;
  25.     float4  BlendWeights    : BLENDWEIGHT;
  26.     float4  BlendIndices    : BLENDINDICES;
  27.     float3  Normal          : NORMAL;
  28.     float3  Tex0            : TEXCOORD0;
  29. };
  30.  
  31. struct VS_OUTPUT
  32. {
  33.     float4  Pos     : POSITION;
  34.     float4  Diffuse : COLOR;
  35.     float2  Tex0    : TEXCOORD0;
  36.     float2  Tex1    : TEXCOORD1;
  37.     float2  Tex2    : TEXCOORD2;
  38.     float2  Tex3    : TEXCOORD3;
  39. };
  40.  
  41.  
  42. float3 Diffuse(float3 Normal)
  43. {
  44.     float CosTheta;
  45.     CosTheta = max(0.0f, dot(Normal, LightDirection.xyz));  // N.L Clamped
  46.     float3 ct = (CosTheta);
  47.     return ct;    // propogate scalar result to vector
  48. }
  49.  
  50. VS_OUTPUT VShade(VS_INPUT i, uniform int NumBones)
  51. {
  52.     VS_OUTPUT   o;
  53.     float3      Pos = 0.0f;
  54.     float3      Normal = 0.0f;    
  55.     float       LastWeight = 0.0f;
  56.      
  57.     // Compensate for lack of UBYTE4 on Geforce3
  58.     int4 IndexVector = D3DCOLORtoUBYTE4(i.BlendIndices);
  59.  
  60.     // cast the vectors to arrays for use in the for loop below
  61.     float BlendWeightsArray[4] = (float[4])i.BlendWeights;
  62.     int   IndexArray[4]        = (int[4])IndexVector;
  63.     
  64.     for (int iBone = 0; iBone < NumBones-1; iBone++)
  65.     {
  66.         LastWeight = LastWeight + BlendWeightsArray[iBone];
  67.         
  68.         Pos += mul(i.Pos, WorldMatrixArray[IndexArray[iBone]]) * BlendWeightsArray[iBone];
  69.         Normal += mul(i.Normal, WorldMatrixArray[IndexArray[iBone]]) * BlendWeightsArray[iBone];
  70.     }
  71.     LastWeight = 1.0f - LastWeight; 
  72.  
  73.     // Now that we have the calculated weight, add in the final influence
  74.     Pos += (mul(i.Pos, WorldMatrixArray[IndexArray[NumBones-1]]) * LastWeight);
  75.     Normal += (mul(i.Normal, WorldMatrixArray[IndexArray[NumBones-1]]) * LastWeight); 
  76.     
  77.     o.Diffuse = float4(Diffuse(normalize(Normal)),1.0) + BlinkFactor;
  78.     
  79.     o.Tex3.xy = mul( float4(Pos.xyz, 1.0f), ShadowViewProjection ).z + ZBias.w;
  80.     o.Tex1.xy = mul( float4(Pos.xyz, 1.0f), TextureMatrix ).xy;
  81.     
  82.     o.Pos = mul(float4(Pos.xyz, 1.0f), WorldMatrix);
  83.  
  84.     // copy the input texture coordinate through
  85.     o.Tex0    = i.Tex0.xy;
  86.     o.Tex2.xy = o.Pos.xz * 0.001953125; //  ~ / 512
  87.  
  88.     o.Pos = mul(o.Pos, ViewProjection);
  89.  
  90.     return o;
  91. }
  92.  
  93. int CurNumBones = 2;
  94. VertexShader vsArray[4] = { compile vs_1_1 VShade(1), 
  95.                             compile vs_1_1 VShade(2),
  96.                             compile vs_1_1 VShade(3),
  97.                             compile vs_1_1 VShade(4)
  98.                           };
  99.  
  100. VS_OUTPUT VShadeShadow(VS_INPUT i, uniform int NumBones)
  101. {
  102.     VS_OUTPUT   o;
  103.     float3      Pos = 0.0f;
  104.     float3      Normal = 0.0f;    
  105.     float       LastWeight = 0.0f;
  106.      
  107.     // Compensate for lack of UBYTE4 on Geforce3
  108.     int4 IndexVector = D3DCOLORtoUBYTE4(i.BlendIndices);
  109.  
  110.     // cast the vectors to arrays for use in the for loop below
  111.     float BlendWeightsArray[4] = (float[4])i.BlendWeights;
  112.     int   IndexArray[4]        = (int[4])IndexVector;
  113.     
  114.     for (int iBone = 0; iBone < NumBones-1; iBone++)
  115.     {
  116.         LastWeight = LastWeight + BlendWeightsArray[iBone];
  117.         
  118.         Pos += mul(i.Pos, WorldMatrixArray[IndexArray[iBone]]) * BlendWeightsArray[iBone];
  119.         Normal += mul(i.Normal, WorldMatrixArray[IndexArray[iBone]]) * BlendWeightsArray[iBone];
  120.     }
  121.     LastWeight = 1.0f - LastWeight; 
  122.  
  123.     // Now that we have the calculated weight, add in the final influence
  124.     Pos += (mul(i.Pos, WorldMatrixArray[IndexArray[NumBones-1]]) * LastWeight);
  125.     Normal += (mul(i.Normal, WorldMatrixArray[IndexArray[NumBones-1]]) * LastWeight); 
  126.     
  127.     o.Diffuse = float4(Diffuse(normalize(Normal)),1.0) + BlinkFactor;
  128.     
  129.     o.Tex3.xy = mul( float4(Pos.xyz, 1.0f), ShadowViewProjection ).z;
  130.     o.Tex1.xy = mul( float4(Pos.xyz, 1.0f), TextureMatrix ).xy;
  131.     
  132.     o.Pos = mul(float4(Pos.xyz, 1.0f), WorldMatrix);
  133.  
  134.     // copy the input texture coordinate through
  135.     o.Tex0    = i.Tex0.xy;
  136.     o.Tex2.xy = o.Pos.xz * 0.001953125; //  ~ / 512
  137.  
  138.     o.Pos = mul(o.Pos, ViewProjection);
  139.  
  140.     return o;
  141. }
  142.  
  143.  
  144. VertexShader vsArrayShadow[4] = { compile vs_1_1 VShadeShadow(1), 
  145.                             compile vs_1_1 VShadeShadow(2),
  146.                             compile vs_1_1 VShadeShadow(3),
  147.                             compile vs_1_1 VShadeShadow(4)
  148.                           };
  149.  
  150. //////////////////////////////////////
  151. // Techniques specs follow
  152. //////////////////////////////////////
  153. technique Technique0
  154. {
  155.     pass p0
  156.     {
  157.         VertexShader = (vsArray[CurNumBones]);
  158.  
  159.         ALPHABLENDENABLE = TRUE;
  160.         SRCBLEND         = SRCALPHA;
  161.         DESTBLEND        = INVSRCALPHA;
  162.         ALPHATESTENABLE  = FALSE;
  163.  
  164.         Texture[0]               = (DiffuseTexture);
  165.         Texture[1]               = (FogOfWar);
  166.         Texture[2]               = (ShadowTexture);
  167.  
  168.         PixelShaderConstant[17]  = (Ambient);
  169.  
  170.         PixelShader = 
  171.         asm
  172.         {
  173.             ps_1_4
  174.               def c0, 1, 1, 1, 1
  175.             def c1, 0.0, 0.0, 0.0, 0
  176.             
  177.             def c2, 0., 0., 0., .0        // zero
  178.             def c3, 1.0, 1.0, 1.0, 1.0    // fog color
  179.             def c16, 0.5, 0., 0., .0        // zero
  180.             def c18, 10., 0., 0.1, 1.0        // ambient color
  181.             def c19, 0.004, 0.0, 0.0, 0.0
  182.  
  183.             dcl t0.xy
  184.             dcl t1.xy
  185.             dcl t2.xy
  186.             dcl t3.x
  187.             dcl v0.rgba
  188.  
  189.             dcl_2d s0
  190.             dcl_2d s1
  191.             dcl_2d s2
  192.             
  193.             texld   r1,  t0, s0
  194.             sub     r2, r1.a, c16.x
  195.             texkill r2
  196.             texld   r10, t1, s2
  197. //            add        r10.x, r10.x, c19.x        //Z bias!
  198.             sub     r9.r, r10.r, t3.x
  199.             mov     r2, c1
  200.             cmp     r10, r9.r, c0, r2
  201.         
  202.             mad     r0, r10, v0, c17
  203.             mul     r0, r1, r0
  204.             texld   r2, t2, s1
  205.             mul     r0, r2, r0 
  206.             mov     r0.a, r1.a
  207.             mov     oC0, r0
  208.         };
  209.     }
  210. }
  211.  
  212.  
  213. //////////////////////////////////////
  214. // Techniques specs follow
  215. //////////////////////////////////////
  216. technique Technique2
  217. {
  218.     pass p0
  219.     {
  220.         VertexShader = (vsArrayShadow[CurNumBones]);
  221.  
  222.         ALPHABLENDENABLE = FALSE;
  223.         ALPHATESTENABLE  = FALSE;
  224.  
  225.         Texture[0]               = (DiffuseTexture);
  226.  
  227.         PixelShader = 
  228.         asm
  229.         {
  230.             ps_1_4
  231.             def c16, 0.5, 0.065, 25.0, 1.0
  232.  
  233.             dcl t0.xy
  234.             dcl t3.xy
  235.             dcl v0.rgba
  236.  
  237.             dcl_2d s0
  238.  
  239.             texld   r0,  t0, s0
  240.             sub     r0, r0.a, c16.x
  241.             texkill r0
  242.             mov     r0, t3.x
  243.             mov        oC0, r0
  244.         };
  245.     }
  246. }
  247.  
  248.  
  249. VS_OUTPUT VShade2( VS_INPUT i )
  250. {
  251.     VS_OUTPUT   o;
  252.     float3      Pos = 0.0f;
  253.     float3      Normal = 0.0f;    
  254.      
  255.     o.Tex3.xy = mul( float4(i.Pos.xyz, 1.0f), ShadowViewProjection ).z + ZBias.w;
  256.     o.Tex1.xy = mul( float4(i.Pos.xyz, 1.0f), TextureMatrix ).xy;
  257.  
  258.     // cast the vectors to arrays for use in the for loop below
  259.     Pos = mul(i.Pos, WorldMatrix );
  260.     Normal = mul(i.Normal, WorldMatrix );
  261.     
  262.     // transform position from world space into view and then projection space
  263.     o.Pos = mul(float4(Pos.xyz, 1.0f), ViewProjection);
  264.  
  265.     o.Diffuse = float4(Diffuse(normalize(Normal)),1.0) + BlinkFactor;
  266.  
  267.     // copy the input texture coordinate through
  268.     o.Tex0    = i.Tex0.xy;
  269.     o.Tex2.xy = Pos.xz * 0.001953125;
  270.  
  271.     return o;
  272. }
  273.  
  274. VS_OUTPUT VShade2Shadow( VS_INPUT i )
  275. {
  276.     VS_OUTPUT   o;
  277.     float3      Pos = 0.0f;
  278.     float3      Normal = 0.0f;    
  279.      
  280.     // cast the vectors to arrays for use in the for loop below
  281.     o.Tex3.xy = mul( float4(i.Pos.xyz, 1.0f), ShadowViewProjection ).z;
  282.     o.Tex1.xy = mul( float4(i.Pos.xyz, 1.0f), TextureMatrix ).xy;
  283.  
  284.     Pos = mul(i.Pos, WorldMatrix );
  285.     Normal = mul(i.Normal, WorldMatrix );
  286.     
  287.     // transform position from world space into view and then projection space
  288.     o.Pos = mul(float4(Pos.xyz, 1.0f), ViewProjection);
  289.  
  290.     o.Diffuse = float4(Diffuse(normalize(Normal)),1.0);
  291.  
  292.     // copy the input texture coordinate through
  293.     o.Tex0    = i.Tex0.xy;
  294.     o.Tex2.xy = Pos.xz * 0.001953125;
  295.  
  296.     return o;
  297. }
  298.  
  299. //////////////////////////////////////
  300. // Techniques specs follow
  301. //////////////////////////////////////
  302. technique Technique1
  303. {
  304.     pass p0
  305.     {
  306.         VertexShader = compile vs_1_1 VShade2();
  307.  
  308.         ALPHABLENDENABLE = TRUE;
  309.         SRCBLEND         = SRCALPHA;
  310.         DESTBLEND        = INVSRCALPHA;
  311.         ALPHATESTENABLE  = FALSE;
  312.  
  313.         Texture[0]               = (DiffuseTexture);
  314.         Texture[1]               = (FogOfWar);
  315.         Texture[2]               = (ShadowTexture);
  316.  
  317.         PixelShaderConstant[17]  = (Ambient);
  318.  
  319.         PixelShader = 
  320.         asm
  321.         {
  322.             ps_1_4
  323.               def c0, 1, 1, 1, 1
  324.             def c1, 0.0, 0.0, 0.0, 0
  325.             
  326.             def c2, 0., 0., 0., .0        // zero
  327.             def c3, 1.0, 1.0, 1.0, 1.0    // fog color
  328.             def c16, 0.5, 0., 0., .0        // zero
  329.             def c18, 10., 0., 0.1, 1.0        // ambient color
  330.             def c19, 0.004, 0.0, 0.0, 0.0
  331.  
  332.             dcl t0.xy
  333.             dcl t1.xy
  334.             dcl t2.xy
  335.             dcl t3.x
  336.             dcl v0.rgba
  337.  
  338.             dcl_2d s0
  339.             dcl_2d s1
  340.             dcl_2d s2
  341.             
  342.             texld   r1,  t0, s0
  343.             sub     r2, r1.a, c16.x
  344.             texkill r2
  345.             texld   r10, t1, s2
  346. //            add        r10.x, r10.x, c19.x        //Z bias!
  347.             sub     r9.r, r10.r, t3.x
  348.             mov     r2, c1
  349.             cmp     r10, r9.r, c0, r2
  350.             
  351.             mad     r0, r10, v0, c17
  352.             mul     r0, r1, r0
  353.             texld   r2, t2, s1
  354.             mul     r0, r2, r0 
  355.             mov     r0.a, r1.a
  356.             mov     oC0, r0
  357.         };
  358.     }
  359. }
  360.  
  361. //////////////////////////////////////
  362. // Techniques specs follow
  363. //////////////////////////////////////
  364. technique Technique3
  365. {
  366.     pass p0
  367.     {
  368.         VertexShader = compile vs_1_1 VShade2Shadow();
  369.  
  370.         ALPHABLENDENABLE = FALSE;
  371.         ALPHATESTENABLE  = FALSE;
  372.  
  373.         Texture[0]               = (DiffuseTexture);
  374.  
  375.         PixelShader = 
  376.         asm
  377.         {
  378.             ps_1_4
  379.             def c16, 0.5, 0.065, 25.0, 1.0
  380.  
  381.             dcl t0.xy
  382.             dcl t3.xy
  383.             dcl v0.rgba
  384.  
  385.             dcl_2d s0
  386.  
  387.             texld   r0,  t0, s0
  388.             sub     r0, r0.a, c16.x
  389.             texkill r0
  390.             mov     r0, t3.x
  391.             mov        oC0, r0
  392.         };
  393.     }
  394. }
  395.